package com.pro.admin.web.guanwang;


import com.baidu.unbiz.fluentvalidator.ComplexResult;
import com.baidu.unbiz.fluentvalidator.FluentValidator;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pro.admin.annotation.RequiresPermissionsDesc;
import com.pro.admin.web.BaseController;
import com.pro.core.util.ResponseUtil;
import com.pro.core.validator.NotNullValidator;
import com.pro.db.domain.GuopuCategory;
import com.pro.db.domain.GuopuCategoryRichtext;
import com.pro.db.enums.EnumContentType;
import com.pro.db.service.itf.IGuopuCategoryRichtextService;
import com.pro.db.service.itf.IGuopuCategoryService;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import static com.baidu.unbiz.fluentvalidator.ResultCollectors.toComplex;

/**
 * <p>
 * 文本内容表 前端控制器
 * </p>
 *
 * @author wanglei
 * @since 2019-12-22
 */
@RestController
@RequestMapping("/admin/richtext")
public class GuopuCategoryRichtextController extends BaseController {
    private final Log logger = LogFactory.getLog(GuopuCategoryRichtextController.class);

    @Autowired
    private IGuopuCategoryRichtextService richtextService;

    @Autowired
    private IGuopuCategoryService categoryService;

    /**
     * @apiDefine richtext 内容接口
     *
     */

    /**
     * @api {POST} /admin/richtext/create 2.1 添加内容
     * @apiName richtext create
     * @apiGroup richtext
     * @apiVersion 1.0.0
     * @apiDescription 接口负责人-王雷
     *
     * @apiParam {int} categoryId 子栏目id（只有子栏目才需要添加和管理内容）
     * @apiParam {String} title 标题
     * @apiParam {String} [description] 简介，如果是列表类型的栏目，简介不能为空
     * @apiParam {String} [coverUrl] 封面图片，用于列表展示的图片，如果是多张请用逗号自行分割，取值时自行分割
     * @apiParam {Integer} [coverType] 封面展示方式(主要用于APP列表中的展示)(1单图靠左 默认，2单图靠右，3双图，4三图，5单张大图)图片数量不够时，按1展示
     * @apiParam {String} content 富文本内容,图片为图片地址，视频为视频地址
     * @apiParam {int} [pushStatus] 是否展示，默认1展示， 0不展示。如果子栏目的类型为富文本类型，则只会展示一个富文本内容，这里设置为展示后，该栏目下其他富文本内容将不展示
     *
     * @apiSuccess {int} errno 结果码 0:正常返回,-1服务异常
     * @apiSuccess {String} errmsg 前端提示消息
     * @apiSuccess {Object} data 结果集
     * @apiSuccessExample Success-Response:
     * HTTP/1.1 200 OK
    {
     *     "errno": 0,
     *     "errmsg": "成功"
     * }
     */
    @RequiresPermissions("admin:richtext:create")
    @RequiresPermissionsDesc(menu={"内容管理" , "内容管理"}, button="添加")
    @PostMapping("/create")
    public Object create(@RequestBody GuopuCategoryRichtext richtext) {
        ComplexResult check = FluentValidator.checkAll()
                .on(richtext, new NotNullValidator("内容"))
                .on(richtext.getCategoryId(), new NotNullValidator("栏目ID"))
                .on(richtext.getTitle(), new NotNullValidator("栏目标题"))
                .on(richtext.getContent(), new NotNullValidator("栏目内容"))
                .doValidate()
                .result(toComplex());
        if (!check.isSuccess()) {
            //参数校验不通过，直接返回结果并提示缺少哪些参数
            return ResponseUtil.fail(check.getErrors());
        }

        GuopuCategory category = categoryService.getById(richtext.getCategoryId());
        if(category == null){
            ResponseUtil.fail("子栏目不存在");
        }

        //如果是列表类型的栏目，简介不能为空
        if(StringUtils.isEmpty(richtext.getDescription()) &&
                category.getType().equals(EnumContentType.CONTENT_ARTICLE_LIST.getKey())){
            ResponseUtil.fail("简介不能为空");
        }

        //如果是富文本类型，需要设置为推送展示，则需更新该栏目下其他的文章为不展示
        if((richtext.getPushStatus() == null || richtext.getPushStatus().equals(1) ) &&
                category.getType().equals(EnumContentType.CONTENT_RICHTEXT.getKey())){
            GuopuCategoryRichtext update = new GuopuCategoryRichtext();
            //update.setCategoryId(richtext.getCategoryId());
            update.setPushStatus(0);
            richtextService.update(update,new QueryWrapper<GuopuCategoryRichtext>()
                .eq("category_id",richtext.getCategoryId()));

            richtext.setPushSort(1);
        }

        richtext.setDeleted(0);
        richtext.setAdminId(getCurrentUser().getId());
        richtext.setAdminName(getCurrentUser().getUsername());
        richtextService.save(richtext);
        return ResponseUtil.ok();
    }

    /**
     * @api {GET} /admin/richtext/list 2.2 内容列表
     * @apiName richtext list
     * @apiGroup richtext
     * @apiVersion 1.0.0
     * @apiDescription 接口负责人-王雷
     *
     * @apiParam {int} categoryId 子栏目ID
     * @apiParam {int} [page] 页码
     * @apiParam {int} [size] 每页数量
     *
     * @apiSuccess {int} errno 结果码 0:正常返回,-1服务异常
     * @apiSuccess {String} errmsg 前端提示消息
     * @apiSuccess {Object} data 结果集
     * @apiSuccessExample Success-Response:
     * HTTP/1.1 200 OK
    {
     *     "errno": 0,
     *     "errmsg": "成功"
     * }
     */
    @RequiresPermissions("admin:richtext:list")
    @RequiresPermissionsDesc(menu={"内容管理" , "内容管理"}, button="查询")
    @GetMapping("/list")
    public Object list(@NotNull Integer categoryId,
                       @RequestParam(defaultValue = "1") Integer page,
                       @RequestParam(defaultValue = "10") Integer size) {
        Page<GuopuCategoryRichtext> pageVo = new Page<>();
        pageVo.setCurrent(page);
        pageVo.setSize(size);
        IPage<GuopuCategoryRichtext> pList = richtextService.page(pageVo,
                new QueryWrapper<GuopuCategoryRichtext>()
                        .eq("category_id",categoryId)
                        .eq("deleted",0)
                        .orderByDesc("add_time"));

        Map<String, Object> data = new HashMap<>();
        data.put("total", pList.getTotal());
        data.put("items", pList.getRecords());

        return ResponseUtil.ok(data);
    }

    /**
     * @api {GET} /admin/richtext/read 2.3 内容详情
     * @apiName richtext read
     * @apiGroup richtext
     * @apiVersion 1.0.0
     * @apiDescription 接口负责人-王雷
     *
     * @apiParam {int} id 内容id
     *
     * @apiSuccess {int} errno 结果码 0:正常返回,-1服务异常
     * @apiSuccess {String} errmsg 前端提示消息
     * @apiSuccess {Object} data 结果集
     * @apiSuccessExample Success-Response:
     * HTTP/1.1 200 OK
    {
     *     "errno": 0,
     *     "errmsg": "成功"
     * }
     */
    @RequiresPermissions("admin:richtext:read")
    @RequiresPermissionsDesc(menu={"内容管理" , "内容管理"}, button="详情")
    @GetMapping("/read")
    public Object read(@NotNull Integer id) {
        GuopuCategoryRichtext category = richtextService.getById(id);
        return ResponseUtil.ok(category);
    }

    /**
     * @api {Post} /admin/richtext/update 2.4 内容更新
     * @apiName richtext update
     * @apiGroup richtext
     * @apiVersion 1.0.0
     * @apiDescription 接口负责人-王雷
     *
     * @apiParam {int} id 富文本内容id
     * @apiParam {int} categoryId 子栏目id（只有子栏目才需要添加和管理内容）
     * @apiParam {String} title 标题
     * @apiParam {String} [desc] 简介，如果是列表类型的栏目，简介不能为空
     * @apiParam {String} [coverUrl] 封面图片，用于列表展示的图片，如果是多张请用逗号自行分割，取值时自行分割
     * @apiParam {Integer} [coverType] 封面展示方式(主要用于APP列表中的展示)(1单图靠左 默认，2单图靠右，3双图，4三图，5单张大图)图片数量不够时，按1展示
     * @apiParam {String} content 富文本内容,图片为图片地址，视频为视频地址
     * @apiParam {int} [pushStatus] 是否展示，默认1展示， 0不展示。如果子栏目的类型为富文本类型，则只会展示一个富文本内容，这里设置为展示后，该栏目下其他富文本内容将不展示
     *
     * @apiSuccess {int} errno 结果码 0:正常返回,-1服务异常
     * @apiSuccess {String} errmsg 前端提示消息
     * @apiSuccess {Object} data 结果集
     * @apiSuccessExample Success-Response:
     * HTTP/1.1 200 OK
    {
     *     "errno": 0,
     *     "errmsg": "成功"
     * }
     */
    @RequiresPermissions("admin:richtext:update")
    @RequiresPermissionsDesc(menu={"内容管理" , "内容管理"}, button="更新")
    @PostMapping("/update")
    public Object update(@RequestBody GuopuCategoryRichtext richtext) {
        ComplexResult check = FluentValidator.checkAll()
                .on(richtext, new NotNullValidator("内容"))
                .on(richtext.getId(), new NotNullValidator("内容ID"))
                .on(richtext.getCategoryId(), new NotNullValidator("栏目ID"))
                .on(richtext.getTitle(), new NotNullValidator("栏目标题"))
                .on(richtext.getContent(), new NotNullValidator("栏目内容"))
                .doValidate()
                .result(toComplex());
        if (!check.isSuccess()) {
            //参数校验不通过，直接返回结果并提示缺少哪些参数
            return ResponseUtil.fail(check.getErrors());
        }

        GuopuCategory category = categoryService.getById(richtext.getCategoryId());
        if(category == null){
            ResponseUtil.fail("栏目不存在");
        }

        //如果是列表类型的栏目，简介不能为空
        if(StringUtils.isEmpty(richtext.getDescription()) &&
                category.getType().equals(EnumContentType.CONTENT_ARTICLE_LIST.getKey())){
            ResponseUtil.fail("简介不能为空");
        }

        //如果是富文本类型，需要设置为推送展示，则需更新该栏目下其他的文章为不展示
        if((richtext.getPushStatus() == null || richtext.getPushStatus().equals(1) ) &&
                category.getType().equals(EnumContentType.CONTENT_RICHTEXT.getKey())){
            GuopuCategoryRichtext update = new GuopuCategoryRichtext();
            //update.setCategoryId(richtext.getCategoryId());
            update.setPushStatus(0);
            richtextService.update(update,new QueryWrapper<GuopuCategoryRichtext>()
                    .eq("category_id",richtext.getCategoryId()));
            richtext.setPushSort(1);
        }

        richtext.setUpdateTime(new Date());
        richtextService.updateById(richtext);
        return ResponseUtil.ok();
    }

    /**
     * @api {POST} /admin/richtext/delete 2.5 内容删除
     * @apiName richtext delete
     * @apiGroup richtext
     * @apiVersion 1.0.0
     * @apiDescription 接口负责人-王雷
     *
     * @apiParam {int} id 内容id
     *
     * @apiSuccess {int} errno 结果码 0:正常返回,-1服务异常
     * @apiSuccess {String} errmsg 前端提示消息
     * @apiSuccess {Object} data 结果集
     * @apiSuccessExample Success-Response:
     * HTTP/1.1 200 OK
    {
     *     "errno": 0,
     *     "errmsg": "成功"
     * }
     */
    @RequiresPermissions("admin:richtext:delete")
    @RequiresPermissionsDesc(menu={"内容管理" , "内容管理"}, button="删除")
    @PostMapping("/delete")
    public Object delete(@RequestBody GuopuCategoryRichtext richtext) {
        Integer id = richtext.getId();
        if (id == null) {
            return ResponseUtil.fail("内容ID不能为空");
        }
        richtextService.removeById(id);
        return ResponseUtil.ok();
    }

}

